package com.example.pdf;

import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.extgstate.PdfExtGState;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;

public class Demo {
    public static final String DEST = "C:\\Users\\zhbcm\\Desktop\\readme1.pdf";
    public static final String IMG = "E:\\图片\\th.jpg";
    public static final String SRC = "C:\\Users\\zhbcm\\Desktop\\readme.pdf";

    public static void main(String[] args) throws Exception {
        new Demo().manipulatePdf(DEST);
    }


    protected void manipulatePdf(String dest) throws Exception {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
        Document doc = new Document(pdfDoc);
//        PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA);
        // 这个实体是宋体中文字体，只有 4, m
        // 字体文件源码中只支持 afm、pfm、ttf、otf、woff、woff2，等你提供不支持的格式就会报错，点进去看源码就知道了
        // ttc 看到源码中也支持，但是提供 ttc 就报错，暂时没深入看源码如何报错
        // final PdfFont font = PdfFontFactory.createFont("C:\\temp\\songti.ttf",
        //         // 水平书写
        //         PdfEncodings.IDENTITY_H,
        //         // 是否将字体嵌入到目标文档中
        //         // 该参数被  PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED 代替，true 对应  PREFER_EMBEDDED，如果可能，嵌入字体
        //         true);
        // 多行文本使用 \n 换行
        Paragraph paragraph = new Paragraph("My watermark (中国强text) \n 中国")
                // .setFont(font)
                .setOpacity(0.1F) // 字体透明度 0-1 完全透明~不透明
                .setFontSize(30); // 字体大小
        ImageData img = ImageDataFactory.create(IMG);

        float w = img.getWidth();
        float h = img.getHeight();

        // 用于添加图片水印，设置图片水印透明度
        PdfExtGState gs1 = new PdfExtGState().setFillOpacity(0.5f);

        // Implement transformation matrix usage in order to scale image
        for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {

            PdfPage pdfPage = pdfDoc.getPage(i);
            // 获取页面大小，考虑页面旋转
            Rectangle pageSize = pdfPage.getPageSizeWithRotation();

            // 当页面有旋转时，内容自动旋转
            pdfPage.setIgnorePageRotationForContent(true);

            // 计算添加的位置坐标
            float x = (pageSize.getLeft() + pageSize.getRight()) / 2;
            float y = (pageSize.getTop() + pageSize.getBottom()) / 2;

            // 添加图片水印使用
            PdfCanvas over = new PdfCanvas(pdfDoc.getPage(i));
            over.saveState();
            over.setExtGState(gs1);

            if (i % 2 == 1) {
                // 添加文本水印
                // 参数分别为：文本、x 坐标、y 坐标、添加到第几页、文本水平对齐方式、文本垂直对齐方式、旋转弧度
                doc.showTextAligned(paragraph, x, y, i, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
            } else {
                // 添加图片水印
                over.addImageWithTransformationMatrix(img, w, 0, 0, h, x - (w / 2), y - (h / 2), false);
            }
            over.restoreState();
        }

        doc.close();
    }
}
